package main

import (
	"errors"
	"fmt"
	"log"
	"net/http"

	"yuanaiproblem/config"
	"yuanaiproblem/middlewares"

	"yuanaiproblem/migrations/db"
	"yuanaiproblem/migrations/redis"
	"yuanaiproblem/routers"

	"github.com/gin-gonic/gin"
)

// InitApp 统一初始化所有组件并返回路由引擎
func InitApp() (*gin.Engine, error) {
	// 初始化环境变量（最优先，其他组件可能依赖环境变量）
	if err := config.InitEnv(); err != nil {
		return nil, fmt.Errorf("环境变量初始化失败: %w", err)
	}
	fmt.Println("袁志华1，", config.Env.AppPort)
	// 初始化数据库（Redis可能依赖数据库配置，故优先初始化）
	if err := db.Init(); err != nil {
		return nil, fmt.Errorf("数据库初始化失败: %w", err)
	}
	// 初始化Redis
	if err := redis.InitRedis(); err != nil {
		return nil, fmt.Errorf("redis初始化失败: %w", err)
	}
	// 初始化日志
	if err := middlewares.InitLogFile("./log"); err != nil {
		return nil, fmt.Errorf("日志初始化失败: %w", err)
	}
	// 设置路由（依赖前面的组件初始化完成）
	r := routers.SetupRouter()
	if r == nil {
		return nil, errors.New("路由初始化失败: 路由引擎为nil")
	}
	return r, nil
}

func main() {
	// 初始化APP
	r, err := InitApp()
	if err != nil {
		log.Fatalf("初始化应用失败: %v", err)
	}
	//启动服务器，监听8080端口
	if err := r.Run(fmt.Sprintf(":%s", config.Env.AppPort)); err != nil && err != http.ErrServerClosed {
		log.Fatalf("启动服务器失败: %v", err)
	}

}
